import axios from "axios";
// 引入判断状态码的文件
import { errorMsg } from "./statusCode";
// 设置接口超时时间
axios.defaults.timeout = 10000;
// 请求地址，这里是动态赋值的的环境变量
// @ts-ignore
axios.defaults.baseURL = import.meta.env.VITE_API_URL;

//http request 拦截器
axios.interceptors.request.use(
  (config) => {
    // 设置请求头
    // 注意带token，浏览器就会认为是非简单请求，会发预检请求给服务器确认，如果后端没做处理，会报cors。
    config.headers = {
      ...config.headers,
      // token: "",
    };
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

//http response 拦截器
axios.interceptors.response.use(
  (response) => {
    // 请求成功
    // 可以在这里处理后端返回的业务状态码
    return response;
  },
  (error) => {
    // 请求失败
    const { response } = error;
    if (response) {
      // 请求已发出，但是不在2xx的范围
      // 这里的响应码不是后端返回的自定义业务状态码，而是http状态码
      // 传入响应码，匹配响应码对应信息
      console.log(errorMsg(response.status));
      // 返回错误信息
      return Promise.reject(error);
    } else {
      // ElMessage.warning("网络连接异常,请稍后再试!");
    }
  }
);

// 封装 GET POST 请求并导出
export function request(url = "", params = {}, type = "POST") {
  //设置 url params type 的默认值
  return new Promise<any>(
    (resolve: (value: object) => void, reject: (value: object) => void) => {
      let promise: any;
      // 判断请求类型
      switch (type.toUpperCase()) {
        // GET请求
        case "GET":
          promise = axios({
            method: "GET",
            url,
            params,
          });
          break;
        // POST请求
        case "POST":
          promise = axios({
            method: "POST",
            url,
            data: params,
          });
          break;

        default:
          break;
      }
      //处理返回
      promise
        .then((res: object) => {
          resolve(res);
        })
        .catch((err: object) => {
          reject(err);
        });
    }
  );
}
